﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;

namespace Shapes
{
    /// <summary>
    /// Figure - это абстрактный класс; прародитель семейства 
    /// классов геометрических фигур. Все фигуры имеют:
    /// центр - center, масштаб - scale. статус
    /// перетаскивания - dragged center - объект встроенного
    /// класса (структуры) Point. Этот объект задает характерную
    /// точку фигуры - чаще всего ее центр (тяжести)
    /// scale задает масштаб фигуры, первоначально единичный.
    /// drugged = true, когда фигура следует за курсором мыши.
    /// над фигурами определены операции: параллельный
    /// перенос - Move(a,b) масштабирование - Scale(s)
    /// Показ фигуры - Show. Область захвата - Region_Capture
    /// возвращает прямоугольник, характерный для фигуры,
    /// перетаскивание фигуры возможно при установке курсора 
    /// мыши в области захвата.
    /// </summary>
    abstract class Figure
    {
        /// <summary>
        /// закрытые для клиентов атрибуты класса - center, scale 
        /// </summary>
        protected Point center;
        protected double scale;
        protected bool dragged;
        protected Color color;
        //Доступ к свойствам 
        public Point center_figure
        {
            get { return (center); }
            set { center = value; }
        }
        public double scale_figure
        {
            get { return (scale); }
            set { scale = value; }
        }
        public bool dragged_figure
        {
            get { return (dragged); }
            set { dragged = value; }
        }
        public Color color_figure
        {
            get { return (color); }
            set { color = value; }
        }
        /// <summary>
        /// базовый конструктор фигур
        /// </summary>
        /// <param name="x">координата X характерной точки 
        ///фигуры</param>
        /// <param name="y">Координата Y характерной точки 
        ///фигуры</param>
        public Figure(int x, int y)
        {
            center = new Point(x, y);
            scale = 1;
            dragged = false;
            color = Color.ForestGreen;
        }
        /// <summary>
        /// отложенный метод 
        /// Параллельный перенос фигуры на (a,b)
        /// require : true;
        /// ensure : для любой точки фигуры p(x,y): 
        /// x = old(x) +a; y = old(y) + b;
        /// </summary>
        /// <param name="a">a - перемещение по горизонтали 
        ///вправо </param>
        /// <param name="b">b - перемещение по вертикали 
        ///вниз</param>
        /// Замечание: Для того, чтобы фигура при рисовании была  
        /// полностью видимой, координаты всех ее точек должны  
        /// быть в пределах области рисования.
        public void Move(int a, int b)
        {
            center.X += a; center.Y += b;
        }
        /// <summary>
        /// изменяет масштаб фигуры
        /// </summary>
        /// <param name="s">масштаб изменяется в s раз</param>
        public void Scale(double s)
        {
            scale *= s;
        }
        /// <summary>
        /// рисование фигуры в окне, передающем объекты g и pen
        /// </summary>
        /// <param name="g"> графический объект, методы которого 
        /// рисуют фигуру</param>
        /// <param name="pen">перо рисования</param>
        public abstract void Show(Graphics g, Pen pen,
            Brush brush);
        public abstract System.Drawing.Rectangle Region_Capture();	
    }
}
